home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
gnu
/
ghview15.gz
/
ghostview-1.5.tar
/
ghostview-1.5
/
Dir.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-07-23
|
4KB
|
164 lines
/*
* Copyright 1989 Software Research Associates, Inc., Tokyo, Japan
*
* Permission to use, copy, modify, and distribute this software and its
* documentation for any purpose and without fee is hereby granted, provided
* that the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation, and that the name of Software Research Associates not be used
* in advertising or publicity pertaining to distribution of the software
* without specific, written prior permission. Software Research Associates
* makes no representations about the suitability of this software for any
* purpose. It is provided "as is" without express or implied warranty.
*
* SOFTWARE RESEARCH ASSOCIATES DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
* SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS,
* IN NO EVENT SHALL SOFTWARE RESEARCH ASSOCIATES BE LIABLE FOR ANY SPECIAL,
* INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
* LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE.
*
* Author: Erik M. van der Poel
* Software Research Associates, Inc., Tokyo, Japan
* erik@sra.co.jp
*/
#include <stdio.h>
#ifdef SEL_FILE_IGNORE_CASE
#include <ctype.h>
#endif /* def SEL_FILE_IGNORE_CASE */
#include "SFinternal.h"
#if defined(SVR4) || defined(SYSV) || defined(USG) || defined(__osf__)
#include <dirent.h>
#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
#include <sys/dir.h>
#define dirent direct
#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
#include <sys/stat.h>
#if defined(SVR4) || defined(SYSV) || defined(USG)
extern void qsort();
#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
#ifdef SEL_FILE_IGNORE_CASE
int
SFcompareEntries(p, q)
SFEntry *p;
SFEntry *q;
{
register char *r, *s;
register char c1, c2;
r = p->real;
s = q->real;
c1 = *r++;
if (islower(c1)) {
c1 = toupper(c1);
}
c2 = *s++;
if (islower(c2)) {
c2 = toupper(c2);
}
while (c1 == c2) {
if (!c1) {
return strcmp(p->real, q->real);
}
c1 = *r++;
if (islower(c1)) {
c1 = toupper(c1);
}
c2 = *s++;
if (islower(c2)) {
c2 = toupper(c2);
}
}
return c1 - c2;
}
#else /* def SEL_FILE_IGNORE_CASE */
int
SFcompareEntries(p, q)
SFEntry *p;
SFEntry *q;
{
return strcmp(p->real, q->real);
}
#endif /* def SEL_FILE_IGNORE_CASE */
int
SFgetDir(dir)
SFDir *dir;
{
SFEntry *result = NULL;
int alloc = 0;
int i;
DIR *dirp;
struct dirent *dp;
char *str;
int len;
int maxChars;
struct stat statBuf;
maxChars = strlen(dir->dir) - 1;
dir->entries = NULL;
dir->nEntries = 0;
dir->nChars = 0;
result = NULL;
i = 0;
dirp = opendir(".");
if (!dirp) {
return 1;
}
(void) stat(".", &statBuf);
dir->mtime = statBuf.st_mtime;
(void) readdir(dirp); /* throw away "." */
#ifndef S_IFLNK
(void) readdir(dirp); /* throw away ".." */
#endif /* ndef S_IFLNK */
while (dp = readdir(dirp)) {
if (i >= alloc) {
alloc = 2 * (alloc + 1);
result = (SFEntry *) XtRealloc((char *) result,
(unsigned) (alloc * sizeof(SFEntry)));
}
result[i].statDone = 0;
str = dp->d_name;
len = strlen(str);
result[i].real = XtMalloc((unsigned) (len + 2));
(void) strcat(strcpy(result[i].real, str), " ");
if (len > maxChars) {
maxChars = len;
}
result[i].shown = result[i].real;
i++;
}
#if defined(SVR4) || defined(SYSV) || defined(USG)
qsort((char *) result, (unsigned) i, sizeof(SFEntry), SFcompareEntries);
#else /* defined(SVR4) || defined(SYSV) || defined(USG) */
qsort((char *) result, i, sizeof(SFEntry), SFcompareEntries);
#endif /* defined(SVR4) || defined(SYSV) || defined(USG) */
dir->entries = result;
dir->nEntries = i;
dir->nChars = maxChars + 1;
closedir(dirp);
return 0;
}